use serde::{Deserialize, Serialize};
use super::{pager::Pager, sorter::Sorter};
use rocket_okapi::okapi::schemars;
use rocket_okapi::okapi::schemars::JsonSchema;
/// PageHelper 结构体用于封装分页、排序和查询参数
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
pub struct PageHelper<T> {
    #[schemars(description = "查询参数，可以是任意类型")]
    pub query: Option<T>,
    #[schemars(description = "分页信息")]
    pub pager: Pager,
    #[schemars(description = "排序信息")]
    pub sorter: Sorter,
}

impl<T> PageHelper<T> {
    /// 创建新的 PageHelper 实例
    ///
    /// # 参数
    /// * `query` - 查询参数
    /// * `pager` - 分页信息
    /// * `sorter` - 排序信息
    ///
    /// # 返回值
    /// 返回一个新的 PageHelper 实例
    pub fn new(query: Option<T>, pager: Pager, sorter: Sorter) -> Self {
        PageHelper {
            query,
            pager,
            sorter,
        }
    }

    /// 设置查询参数
    ///
    /// # 参数
    /// * `query` - 查询参数
    ///
    /// # 返回值
    /// 返回 PageHelper 实例本身
    pub fn set_query(&mut self, query: Option<T>) -> &mut Self {
        self.query = query;
        self
    }

    /// 设置分页信息
    ///
    /// # 参数
    /// * `pager` - 分页信息
    ///
    /// # 返回值
    /// 返回 PageHelper 实例本身
    pub fn set_pager(&mut self, pager: Pager) -> &mut Self {
        self.pager = pager;
        self
    }

    /// 设置排序信息
    ///
    /// # 参数
    /// * `sorter` - 排序信息
    ///
    /// # 返回值
    /// 返回 PageHelper 实例本身
    pub fn set_sorter(&mut self, sorter: Sorter) -> &mut Self {
        self.sorter = sorter;
        self
    }
}

fn main() {
    use crate::extends::core::pager::order::Order;
    use crate::extends::core::db::sql_direction::DirectionEnum;

    // 示例用法
    let pager = Pager::new(1, 10, Some(100), Some(10)); // 假设 Pager 有一个 new 方法
    let sorter = Sorter::new(vec![Order::new("created_at".to_string(), DirectionEnum::DESC)]); // 假设 Sorter 有一个 new 方法

    let mut page_helper: PageHelper<String> = PageHelper::new(Some("example_query".to_string()), pager, sorter);

    // 设置新的查询参数
    page_helper.set_query(Some("new_query".to_string()));

    // 打印 PageHelper 对象
    log::info!("{:?}", page_helper);
}
